package com.wuxuan.javabase_homework.homework1;

import java.util.Arrays;

/**
 * 使用 Java 语言开发一个简易学生成绩管理系统，具体要求如下：
 * 1. 数据类型与变量：系统需记录学生的姓名（字符串类型）、年龄（整型）、数学成绩和语文成绩（双精度浮点型）。在程序开始时，使用合适的数据类型声明并初始化至少三名学生的信息。
 * 2. 运算符运用：计算每位学生的总成绩（数学成绩与语文成绩之和），以及平均成绩。在控制台输出每位学生的姓名、年龄、数学成绩、语文成绩、总成绩和平均成绩。
 * 3. 流程控制：
 * - 选择结构：依据学生的平均成绩划分等级。平均成绩90分及以上为“A”，80 - 89分为“B”，70 - 79分为“C”，60 - 69分为“D”，60分以下为“F” 。在控制台输出每位学生的成绩等级。
 * - 循环结构：使用for循环遍历学生信息数组，对每位学生执行上述计算和等级评定操作。
 * 4. 数组应用：使用数组存储所有学生的信息，便于批量操作和管理。在程序中展示如何通过索引访问和修改数组中的学生信息。例如，修改其中一位学生的数学成绩，并重新计算其总成绩和平均成绩，输出更新后的信息。
 */
public class Homework1 {

    //由于该作业目的是锻炼基础，这里没有封装Student类来完成
    //1.初始化基本数据(作为类变量，然后是全局变量方便些，可以提取重复处作为方法不用传参)
    public static String[] studentNames = {"wuxuan", "wushuang", "jueying"};
    public static int[] age = {18, 19, 20};
    public static double[] chineseScores = {11.1, 70.2, 99.9};
    public static double[] mathScores = {0.5, 80.8, 90.6};
    public static double[] totalScores = new double[3];
    public static double[] averageScores = new double[3];
    public static String[] levels = new String[3];

    public static void main(String[] args) {
        //2.输出学生基本信息
        System.out.println("-------------------------输出学生基本信息-----------------------");
        setAllStudentsTotalScoresAndAverageScoresAndLevels();
        travelStudents();

        //3.根据平均成绩划分等级(在setTotalScoresAndAverageScoresAndLevels()方法中已经完成等级设置)
        System.out.println("-------------------------------输出学生等级--------------------------------");
        //遍历等级数组，打印输出
        for (int i = 0; i < studentNames.length; i++) {
            System.out.println(studentNames[i] + "的成绩等级：" + levels[i]);
        }

        //4.修改wuxuan的语文成绩，从11。1改为99.9
        System.out.println("------------------------修改学生成绩-----------------------------");
        //根据学生姓名获取其索引
        int index = Arrays.asList(studentNames).indexOf("wuxuan");
        //重新设置当前学生的信息
        setStudentTotalScoresAndAverageScoresAndLevels(index);
        System.out.println("当前学生序号：" + (index + 1));
        //根据索引计算并修改对应位置的信息
        chineseScores[index] = 99.9;
        averageScores[index] = averageScore(chineseScores[index], mathScores[index]);
        totalScores[index] = totalScore(chineseScores[index], mathScores[index]);
        setStudnetLevel(index);
        //输出更新后的信息
        System.out.println("当前学生信息更新后如下：");
        travelStudentInfo(index);

    }

    /**
     * 根据学生索引输出某个学生基本信息
     *
     * @param index
     */
    private static void travelStudentInfo(int index) {
        System.out.println("学生序号：" + (index + 1));
        System.out.println("学生姓名：" + studentNames[index]);
        System.out.println("年龄：" + age[index]);
        System.out.println("语文成绩：" + chineseScores[index]);
        System.out.println("数学成绩：" + mathScores[index]);
        System.out.println("平均成绩：" + averageScores[index]);
        System.out.println("总成绩：" + totalScores[index]);
        System.out.println("成绩等级：" + levels[index]);
    }

    /**
     * 遍历所有学生的基本信息
     */
    private static void travelStudents() {
        for (int i = 0; i < studentNames.length; i++) {
            //打印输出
            System.out.println("学生序号：" + (i + 1));
            System.out.println("学生姓名：" + studentNames[i]);
            System.out.println("年龄：" + age[i]);
            System.out.println("语文成绩：" + chineseScores[i]);
            System.out.println("数学成绩：" + mathScores[i]);
            System.out.println("平均成绩：" + averageScores[i]);
            System.out.println("总成绩：" + totalScores[i]);
            System.out.println("成绩等级：" + levels[i]);
            System.out.println("--------------------------------------------------");
        }
    }

    /**
     * 根据学生索引计算并设置某个学生的平均成绩，总成绩，成绩等级
     */
    private static void setStudentTotalScoresAndAverageScoresAndLevels(int i) {
        //计算平均成绩及总成绩并存入数组中
        averageScores[i] = averageScore(chineseScores[i], mathScores[i]);
        totalScores[i] = totalScore(chineseScores[i], mathScores[i]);
        setStudnetLevel(i);
    }

    /**
     * 计算并设置所有学生的平均成绩，总成绩，成绩等级
     */
    private static void setAllStudentsTotalScoresAndAverageScoresAndLevels() {
        for (int i = 0; i < studentNames.length; i++) {
            //计算平均成绩及总成绩并存入数组中
            averageScores[i] = averageScore(chineseScores[i], mathScores[i]);
            totalScores[i] = totalScore(chineseScores[i], mathScores[i]);
        }
        setAllStudentsLevels();
    }


    /**
     * 单独计算并设置某个学生的等级
     *
     * @param i 学生索引
     */
    private static void setStudnetLevel(int i) {
        if (averageScores[i] >= 90) {
            levels[i] = "A";
        } else if (averageScores[i] >= 80) {
            levels[i] = "B";
        } else if (averageScores[i] >= 70) {
            levels[i] = "C";
        } else if (averageScores[i] >= 60) {
            levels[i] = "D";
        } else if (averageScores[i] >= 0) {
            //我看题目跳过了E，这里遵从题目哈
            levels[i] = "F";
        } else {
            System.out.println("第" + (i + 1) + "位学生" + studentNames[i] + "的平均成绩" + averageScores[i] + "异常，请于系统中详细检查！！！");
        }
    }

    /**
     * 遍历每个学生的平均成绩，根据成绩的范围设置等级
     */
    private static void setAllStudentsLevels() {
        for (int i = 0; i < studentNames.length; i++) {
            if (averageScores[i] >= 90) {
                levels[i] = "A";
            } else if (averageScores[i] >= 80) {
                levels[i] = "B";
            } else if (averageScores[i] >= 70) {
                levels[i] = "C";
            } else if (averageScores[i] >= 60) {
                levels[i] = "D";
            } else if (averageScores[i] >= 0) {
                levels[i] = "F";
            } else {
                System.out.println("第" + (i + 1) + "位学生" + studentNames[i] + "的平均成绩" + averageScores[i] + "异常，请于系统中详细检查！！！");
            }
        }
    }


    /**
     * 计算某个学生的总成绩(目前是语文成绩和数学成绩之和)
     *
     * @param chineseScore 语文成绩
     * @param mathScore    数学成绩
     * @return
     */
    private static double totalScore(double chineseScore, double mathScore) {
        return chineseScore + mathScore;
    }

    /**
     * 计算某个学生的平均成绩
     *
     * @param chineseScore
     * @param mathScore
     * @return
     */
    private static double averageScore(double chineseScore, double mathScore) {
        return (chineseScore + mathScore) / 2;
    }

}
